package gameengine;

import java.awt.*;

/**
 * Representa uma animação, um arquivo de spritesheet
 * @author Victor
 */
public class Animacao implements IUpdateable
{
	private Textura _textura;
	private Dimension _frameDimension;

	private int _frameAtual = 0;
	private int quantidadeFramesHorizontal;
	private int quantidadeFramesVertical;

	private float delay;
	private float timer = 0;
	private boolean infinite = true;
	private String _apelido;

	public Animacao(String apelido, Textura textura, Dimension frameDimension, float delay)
	{
		_textura = textura;
		_frameDimension = frameDimension;
		_apelido = apelido;

		this.delay = delay;

		Dimension dimensaoTextura = textura.GetDimension();
		quantidadeFramesHorizontal = dimensaoTextura.width / frameDimension.width;
		quantidadeFramesVertical = dimensaoTextura.height / frameDimension.height;
	}

	public Animacao(String apelido, Textura textura, Dimension frameDimension, float delay, boolean infinite)
	{
		this(apelido, textura, frameDimension, delay);
		this.infinite = infinite;
	}

	/**
	 * Retorna a quantidade de frames que a animação tem
	 * @owner Victor
	 */
	private int GetQuantidadeFrames()
	{
		return quantidadeFramesHorizontal * quantidadeFramesVertical;
	}

	/**
	 * Retorna o retângulo atual dessa animação
	 * @owner Victor
	 */
	public Rectangle GetRetangulo()
	{
		int rectX = (_frameAtual % quantidadeFramesHorizontal) * (int)_frameDimension.width;
		int rectY = (_frameAtual / quantidadeFramesHorizontal) * (int)_frameDimension.height;

		return new Rectangle(rectX, rectY, _frameDimension.width, _frameDimension.height);
	}

	/**
	 * Retorna a textura utilizada por essa animação
	 * @owner Victor
	 */
	public Textura GetTextura()
	{
		return _textura;
	}

	/**
	 * Retorna o frame atual da animação
	 * @owner Victor
	 */
	public int GetFrameAtual()
	{
		return _frameAtual;
	}

	/**
	 * Seta o frame atual da animação
	 * @owner Victor
	 */
	public void SetFrameAtual(int frameAtual)
	{
		_frameAtual = frameAtual;
	}

	/**
	 * Retorna o apelido da animação
	 * @owner Victor
	 */
	public String GetApelido()
	{
		return _apelido;
	}

	/**
	 * Inicia a animação atual
	 * @owner Victor
	 */
	public void Iniciar()
	{
		_frameAtual = 0;
		timer = 0;
	}

	/**
	 * Atualiza a animação a cada frame
	 * @owner Victor
	 */
	public void Atualizar(float milisegundos)
	{
		if (timer >= delay)
		{
			if (_frameAtual < GetQuantidadeFrames() - 1)
			{
				_frameAtual++;
			}
			else if (infinite)
			{
				_frameAtual = 0;
			}

			timer = 0;
		}
		else
		{
			timer += milisegundos;
		}
	}
}
